xen: allow guests to set caching attributes for MMIOs
authorKeir Fraser <keir.fraser@citrix.com>
Thu, 8 Apr 2010 14:30:52 +0000 (15:30 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Thu, 8 Apr 2010 14:30:52 +0000 (15:30 +0100)
This patch allows guests that have directly mapped MMIO regions to set
the caching attributes for them, and only for them.
Currently we have just an on/off check for a directly assigned device
instead of looking for directly mapped MMIO regions.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
xen/arch/x86/hvm/hvm.c
xen/arch/x86/hvm/svm/svm.c
xen/arch/x86/hvm/vmx/vmx.c
xen/arch/x86/mm/shadow/multi.c
xen/include/asm-ia64/domain.h
xen/include/asm-x86/domain.h

index 7e50d5105a9430a75ba047ab4cdfa0d7f3afd038..7e261f24e12c339a80ff890b78f20463dbe5de6e 100644 (file)
@@ -1126,7 +1126,7 @@ int hvm_set_cr0(unsigned long value)
         }
     }
 
-    if ( has_arch_pdevs(v->domain) )
+    if ( has_arch_mmios(v->domain) )
     {
         if ( (value & X86_CR0_CD) && !(value & X86_CR0_NW) )
         {
index cbd5d79be59a18d03da84acfdf55aff5d679c434..d753a434ae1e26bd978a91d6cf384418c49cda04 100644 (file)
@@ -1228,7 +1228,7 @@ static void wbinvd_ipi(void *info)
 
 static void svm_wbinvd_intercept(void)
 {
-    if ( has_arch_pdevs(current->domain) )
+    if ( has_arch_mmios(current->domain) )
         on_each_cpu(wbinvd_ipi, NULL, 1);
 }
 
index 928c86c8b5a043611fcc6452be641a535911c9f0..cc4d3b1e8da6c716ea011ecda438049438a0fecd 100644 (file)
@@ -2109,7 +2109,7 @@ static void wbinvd_ipi(void *info)
 
 static void vmx_wbinvd_intercept(void)
 {
-    if ( !has_arch_pdevs(current->domain) )
+    if ( !has_arch_mmios(current->domain) )
         return;
 
     if ( cpu_has_wbinvd_exiting )
index 9a449b97e8520fe5c384e67d0f7de132f82019f6..38be3863eeb8675e03be0e66967474501c4b6965 100644 (file)
@@ -28,6 +28,7 @@
 #include <xen/sched.h>
 #include <xen/perfc.h>
 #include <xen/domain_page.h>
+#include <xen/iocap.h>
 #include <asm/page.h>
 #include <asm/current.h>
 #include <asm/shadow.h>
@@ -546,7 +547,8 @@ _sh_propagate(struct vcpu *v,
      * For HVM domains with direct access to MMIO areas, set the correct
      * caching attributes in the shadows to match what was asked for.
      */
-    if ( (level == 1) && is_hvm_domain(d) && has_arch_pdevs(d) &&
+    if ( (level == 1) && is_hvm_domain(d) &&
+         iomem_access_permitted(d, mfn_x(target_mfn), mfn_x(target_mfn) + 1) &&
          !is_xen_heap_mfn(mfn_x(target_mfn)) )
     {
         unsigned int type;
index d181b5f826ea5abf7a58460497a7c2b78e2827b2..14064ce2475a368b7f25debfcff84d59064d88f4 100644 (file)
@@ -45,6 +45,7 @@ extern void panic_domain(struct pt_regs *, const char *, ...)
      __attribute__ ((noreturn, format (printf, 2, 3)));
 
 #define has_arch_pdevs(d)    (!list_empty(&(d)->arch.pdev_list))
+#define has_arch_mmios(d)    (!rangeset_is_empty((d)->iomem_caps))
 
 struct mm_struct {
        volatile pgd_t * pgd;
index de238a04925caca4f8b75369dd0d42c43d9a3b9c..35661b85b2ad62458e2967da36e31bfabe7bb255 100644 (file)
@@ -329,6 +329,7 @@ struct arch_domain
 } __cacheline_aligned;
 
 #define has_arch_pdevs(d)    (!list_empty(&(d)->arch.pdev_list))
+#define has_arch_mmios(d)    (!rangeset_is_empty((d)->iomem_caps))
 
 #ifdef CONFIG_X86_64
 #define perdomain_pt_pgidx(v) \